#ifndef SMOKE_H
#define SMOKE_H

#pragma pack(1) // 关闭字节对齐

#define SMOKE_CRTSCTS (1 << 16) // 控制模式
#define SMOKE_ACK_MAX (32)      // 数据最大值

#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <map>
#include <math.h>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <vector>

using namespace std;

extern unsigned int sleep(unsigned int);

class Smoke {
  public:
    /***
     * @name 烟雾参数
     * @description
     * @struct
     */
    typedef struct tagSMOKE {
        int32_t *fd;             // 烟雾指针
        pthread_t *tid;          // 烟雾ID
        uint32_t *signal;        // 烟雾信号
        uint32_t *concentration; // 烟雾浓度
        vector< uint8_t > *ack;  // 烟雾数据
    } SMOKEPARAM, *HSMOKEPARAM;

    // 析构、构造
    ~Smoke();
    Smoke(const string path, const uint32_t baudrate);

    // 获取数据、获取浓度
    vector< uint8_t > &get_ack();
    uint32_t &get_concentration();

  private:
    int32_t fd;             // 烟雾指针
    pthread_t tid;          // 烟雾线程
    uint32_t signal;        // 烟雾信号
    SMOKEPARAM param;       // 参数
    vector< uint8_t > ack;  // 数据
    uint32_t concentration; // 浓度
};
#endif